package com.example.role_based_permission_control.service.impl;

import com.example.role_based_permission_control.dao.MenuMapper;
import com.example.role_based_permission_control.entity.dto.Menu;
import com.example.role_based_permission_control.service.IMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @author 李云龙
 * @program: role_based_permmsion_control
 * @description:
 * @date 2024-09-01 16:24:51
 */
@Service
public class MenuService implements IMenuService {
    @Autowired(required = false)
    private MenuMapper menuMapper;

    /**
     * 获取指定用户的菜单列表，并构建菜单树结构
     *
     * @param userId 用户ID
     * @return 构建好的菜单树
     */
    @Override
    public List<Menu> getUserMenus(int userId) {
        List<Menu> allMenus = menuMapper.getUserMenus(userId);
        return buildMenuTree(allMenus);
    }

    /**
     * 构建菜单树，将所有菜单组织成树状结构
     *
     * @param menus 所有菜单列表
     * @return 根菜单列表，包含其子菜单
     */
    private List<Menu> buildMenuTree(List<Menu> menus) {
        // 获取所有根菜单（即没有父菜单的菜单）
        List<Menu> rootMenus = menus.stream()
                .filter(menu -> menu.getParentMenuId() == null)
                .collect(Collectors.toList());
        // 为每个根菜单设置子菜单
        for (Menu menu : rootMenus) {
            menu.setSubMenus(findSubMenus(menu, menus));
        }
        return rootMenus;
    }

    /**
     * 递归查找并设置子菜单
     *
     * @param rootMenu 当前根菜单
     * @param allMenus 所有菜单列表
     * @return 当前根菜单的子菜单列表
     */
    private List<Menu> findSubMenus(Menu rootMenu, List<Menu> allMenus) {
        // 找到当前根菜单的所有子菜单
        List<Menu> subMenus = allMenus.stream()
                .filter(menu -> rootMenu.getMenuId().equals(menu.getParentMenuId()))
                .collect(Collectors.toList());
        // 为每个子菜单递归设置其子菜单
        for (Menu menu : subMenus) {
            menu.setSubMenus(findSubMenus(menu, allMenus));
        }
        return subMenus;
    }
}